該不該縮圖?縮圖尺寸能不能有彈性一點?可以由前端來指定縮圖尺寸嗎?在網站開發時,經常會碰到這些糾結的問題,easy-thumbnails 最主要的功能就和他的名字一樣,簡化了縮圖的操作。
專案網址:https://easy-thumbnails.readthedocs.io/en/latest/index.html
poetry add easy-thumbnails
# settings
INSTALLED_APPS = [
...
'easy_thumbnails',
]
THUMBNAIL_ALIASES = {
'': {
'avatar': {'size': (50, 50), 'crop': True, 'quality': 90},
},
}
最主要的設定就是在 INSTALLED_APPS 加入 easy_thumbnails
THUMBNAIL_ALIASES 則是用來設定別名以提供快速設定,像上面的 'avatar' 就表示尺寸是 50x50,要裁減,所以後續程式指定要使用 avatar 時,就會使用 50x50 這尺寸,並且進行裁減。
在 template 裡使用,必須要載入 thumbnail ,裡面包含了 easy_thumbnails 的 tag 跟 filter。
{# template #}
{% load thumbnail %}
<img src="{{ profile.photo|thumbnail_url:'avatar' }}" alt="" />
像上面的例子就是使用 filter ,同時也指定使用 avatar 這個別名。
<img src="{% thumbnail profile.photo 120x120 crop %}" alt="" />
也可以直接呼叫 thumbnail 來處理,上面的例子就不使用別名,而是直接指定尺寸跟是否裁減。
在 View 裡也可以直接使用 get_thumbnailer 來處理。
from easy_thumbnails.files import get_thumbnailer
thumb_url = get_thumbnailer(profile.photo)['avatar'].url
上面的例子就是以 get_thumbnailer 去處理 profile.photo ,並套用 avatar 這個別名。
from easy_thumbnails.files import get_thumbnailer
options = {'size': (100, 100), 'crop': True}
thumb_url = get_thumbnailer(profile.photo).get_thumbnail(options).url
同樣的,也可以使用 dict 來自訂尺寸跟是否裁減,再傳遞給 get_thumbnail 。
其實,如果 model 裡有 ImageField 又有縮圖需求的話,可以將 ImageField 改為 ThumbnailerImageField:
# models
from easy_thumbnails.fields import ThumbnailerImageField
class Profile(models.Model):
user = models.OneToOneField('auth.User')
photo = ThumbnailerImageField(upload_to='photos', blank=True)
改用 thumbnailerImageField ,上傳圖片還是跟 ImageField 一樣,但是在使用時,可以直接透過屬性取得縮圖,就不需要再使用 template filter 或是用程式產生了:
{% load thumbnail %}
<img src="{{ profile.photo.avatar.url }}" alt="" />
程式裡使用:
thumb_url = profile.photo['avatar'].url
easy_thumbnails 簡化了許多操作縮圖的步驟,使用上輕鬆許多。easy_thumbnails 的底層使用 pillow,pillow 是一套強大的函式庫,用來處理圖形,如果需要更細部的圖像處理,可以參考 pillow 來做。